The software execution model for calling and returning from a function dictates that upon calling a function, the return address for that function is pushed onto the data stack and upon returning from that function, the return address is popped from the data stack and control flows to that return address. Some security exploits can take advantage of this use of the stack by overwriting the stack entry for a return address with a malicious return address that alters control flow to a location as desired by the attacker. Improvements to techniques for preventing this type of security exploit are constantly being made.